package com.ruoyi.common.utils.msg.util.format;

import com.ruoyi.common.utils.msg.dto.req.FrameReqBody;
import com.ruoyi.common.utils.msg.dto.req.FrameReqHeader;
import com.ruoyi.common.utils.msg.dto.req.FrameReqWrapper;

import java.util.HashMap;
import java.util.Map;

public class TransferFormatUtil {

    public static Map<String, Object> getFormatData(FrameReqWrapper wrapper)
    {
        Map<String, Object> result = new HashMap<>();
        //原始报文
        result.put("originalFrame", wrapper.getOriginalFrame());
        //报文类型   34为小时报
        FrameReqHeader header = wrapper.getReqDto().getHeader();
        String funcCode = header.getFuncCode();
        //如果报文不是 小时报就不执行
        if (!"34".equals(funcCode)){
            return result;
        }
        FrameReqBody body = wrapper.getReqDto().getBody();
        //对应遥测终端编号
        result.put("remoteId", body.getRemoteStationAddr());
        //上报时间
        result.put("reportTime", body.getSendTime());
        //主体数据报文
        body.getElementMap().remove("f0");
        Map<String, Object> data = new HashMap<>();
        body.getElementMap().forEach((key, value) -> {
            //TODO 各类功能码对应的数据格式解析
            Body build =  Body.builder()
                    .remoteId(body.getRemoteStationAddr())
                    .reportTime(body.getObserveTime())
                    .funcCode(value.get(0).getTypeCode())
                    .originalCode(value.get(0).getOriginalData())
                    .formatValue(String.valueOf(value.get(0).getVal()))
                    .sendTime(body.getSendTime())
                    .build();
            data.put(key, build);
        });
        result.put("data", data);
        return result;
    }

    /**
     * 从 Map 中去掉一个键而不影响原来的 Map
     *
     * @param originalMap 原始 Map
     * @param keyToRemove 要移除的键
     * @param <K> 键的类型
     * @param <V> 值的类型
     * @return 新的 Map，其中不包含指定的键
     */
    public static <K, V> Map<K, V> removeKey(Map<K, V> originalMap, K keyToRemove) {
        Map<K, V> newMap = new HashMap<>(originalMap);
        newMap.remove(keyToRemove);
        return newMap;
    }


}
